package main

import (
	"flag"
	"fmt"
	"log"
	"os"

	"gitea.1216.top/lxy/zhub/cmd"
	"gitea.1216.top/lxy/zhub/internal/config"
	"gitea.1216.top/lxy/zhub/internal/monitor"
	"gitea.1216.top/lxy/zhub/internal/zbus"
)

func main() {
	// 命令查询版本号
	versionFlag := flag.Bool("version", false, "Display the version")
	vFlag := flag.Bool("v", false, "Display the version")
	VFlag := flag.Bool("V", false, "Display the version")

	isCliMode := flag.Bool("cli", false, "Run as client mode") // 客户端模式参数
	rcmd := flag.String("r", "", "Run command in client mode") // 客户端命令参数

	// 解析命令行参数
	flag.Parse()

	// 检查是否有版本参数, 如果有则输出版本号并退出
	if *versionFlag || *vFlag || *VFlag {
		fmt.Printf("Version: %s\n", monitor.Version)
		os.Exit(0) // 输出后退出
	}

	conf := config.ReadConfig() // 读取配置文件
	addr := conf.Service.Addr   // 获取服务地址
	config.InitLog(conf.Log)    // 初始化日志配置
	// 输出版本号
	log.Println("ZHub version:", monitor.Version)

	{
		/*
			使用环境变量覆盖 配置文件参数 TODO
			port, err := strconv.Atoi(os.Getenv("PORT"))
			if err != nil {
				port = 6066
			}*/
	}

	if *rcmd != "" { // 如果指定了客户端命令
		adminToken, err := zbus.AuthManager.AdminToken() // 认证信息
		if err != nil {
			log.Fatal(err) // Configuration error, stop the client from running.
			return
		}

		cli := cmd.ZHubClient{}
		err = cli.Initx("server-local", addr, "server-admin", adminToken)

		// cli, err := cmd.Create("server-local", addr, "server-admin", adminToken) // 创建客户端连接
		if err != nil {
			log.Println(err) // 如果连接失败则打印错误信息
			return
		}
		defer cli.Close() // 延迟关闭客户端连接
		switch *rcmd {
		case "timer":
			cli.Cmd("reload-timer")
		case "shutdown", "stop":
			cli.Cmd("shutdown")
		}
		return
	}
	if *isCliMode {
		//cmd.ClientRun(addr) // 客户端运行
	} else {
		go monitor.StartWatch()      // 启动监控协程
		zbus.StartServer(addr, conf) // 启动服务进程
	}
}
